/**
	@author Maciej Suminski
	@version 1.0

	Projekt VoD-ka
	Graficzny interfejs uzytkownika
*/

#include "gui.hpp"
#include "video.hpp"

BEGIN_EVENT_TABLE(Gui, wxFrame)
    EVT_BUTTON(ID_WXBUTTON_PLAY, Gui::onButtonPlay)
    EVT_BUTTON(ID_WXBUTTON_PAUSE, Gui::onButtonPause)
    EVT_BUTTON(ID_WXBUTTON_CLOSE, Gui::onButtonClose)
END_EVENT_TABLE()

/**
    @brief Konstruktor podstawowy. Inicjalizuje wszystkie komponenty graficzne oraz odtwarzacz strumienia wideo.
    @param title  Tytul okna
    @param pos    Pozycja okna (domyslnie srodek)
    @param size   Rozmiar okna
*/
Gui::Gui(const wxString& title, const wxPoint& pos, const wxSize& size)
	: wxFrame( NULL, -1, title, pos, size ) {
    Center();
    SetMinSize(wxSize(MIN_WIDTH, MIN_HEIGHT));
    SetWindowStyleFlag(GetWindowStyleFlag() & ~(wxRESIZE_BORDER));

    textStaticAddress = new wxStaticText(this, ID_WXTEXTSTATIC_ADDRESS, wxT("Adres serwera RTSP"), wxPoint(0,0));
    textCtrlAddress = new wxTextCtrl(this, ID_WXTEXTCTRL_ADDRESS, wxT("rtsp://localhost:8554/test"), wxPoint(0,20), wxSize(300,20));
    buttonPlay = new wxButton(this, ID_WXBUTTON_PLAY, wxT("Otwórz"), wxPoint(310, 0), wxSize(100,40));
    Connect(ID_WXBUTTON_PLAY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Gui::onButtonPlay));
    buttonPause = new wxButton(this, ID_WXBUTTON_PAUSE, wxT("Pauza"), wxPoint(410, 0), wxSize(100,40));
    Connect(ID_WXBUTTON_PAUSE, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Gui::onButtonPause));
    buttonClose = new wxButton(this, ID_WXBUTTON_CLOSE, wxT("Zamknij"), wxPoint(510, 0), wxSize(100,40));
    Connect(ID_WXBUTTON_CLOSE, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Gui::onButtonClose));

    CreateStatusBar(1);
    SetStatusText(wxT("Gotowy"));

    Connect(wxEVT_PAINT, wxPaintEventHandler(Gui::onPaint));

    player = boost::shared_ptr<Player>(new Player(this));
}

/**
    @brief Obsluga nacisniecia przycisku Otworz.
        Po kliknieciu przycisku Otworz nastepuje otwarcie strumienia wideo, okno dostosowuje swoj rozmiar do odtwarzanego strumienia wideo.
        W przypadku niepowodzenia na pasku stanu wyswietlana jest informacja o bledzie.
*/
void Gui::onButtonPlay(wxCommandEvent& event) {
    try {
        player->open(std::string(textCtrlAddress->GetLineText(0).mb_str()));

        // Okreslenie nowego rozmiaru okna (nie moze byc zbyt male, bo utnie przyciski)
        unsigned int newWidth = player->getWidth() < MIN_WIDTH ? MIN_WIDTH : player->getWidth();
        unsigned int newHeight = player->getHeight() < MIN_HEIGHT ? MIN_HEIGHT : player->getHeight() + EXTEND_HEIGHT;
        wxSize newSize(newWidth, newHeight);
        SetSize(newSize);
        SetMinSize(newSize);
        SetMaxSize(newSize);
        Center();

        player->play();
	}
	catch(string& str) {
        SetStatusText(wxString(str.c_str(), wxConvUTF8), 0);        // Wyswietlenie bledu
	}
}

/**
    @brief Obsluga nacisniecia przycisku Pauza.
        Po kliknieciu przycisku Pauza nastepuje wstrzymanie watku odswiezajacego okno w ktorym
        odtwarzany jest strumien.
*/
void Gui::onButtonPause(wxCommandEvent& event)
{
    if(player->getState() == Player::PLAY)
    {
        player->pause();
    } else if(player->getState() == Player::PAUSE)
    {
        player->play();
    }
}

/**
    @brief Obsluga nacisniecia przycisku Zamknij.
        Po kliknieciu przycisku Zamknij nastepuje zamkniecie okna.
*/
void Gui::onButtonClose(wxCommandEvent& event)
{
    Close(TRUE);
}

/**
    @brief Obsluga zdarzenia onPaint.
        Funkcja rysuje kolejne ramki aktualnie odtwarzanego strumienia wideo.
        Jest wywolywana przez watek obiektu Player.
*/
void Gui::onPaint(wxPaintEvent& event)
{
    if(player->getState() == Player::PLAY)
    {
        wxPaintDC dc(this);
        dc.DrawBitmap(player->getFrame(), 0, 40);
    }
}
